import java.io.*;

public class CMUtility {

    private static final BufferedReader read = new BufferedReader(new InputStreamReader(System.in));

    /*
     * 用途：该方法读取键盘，如果用户键入’1’-’5’中的任意字符
     * 则方法返回，返回值为用户键入字符。
     */
    public static char readMenuSelection(){
        char key = ' ';
        while(true){
            try {
                key = read.readLine().charAt(0);
            }catch (Exception e){
                System.out.println("输入类型不合法");
            }
            if(key >= '1' && key <= '5') return key;
            else System.out.println("选择错误，请重新输入！");
        }
    }

    /*
     * 用途：这两个方法功能相同，均从键盘读取一个字符，并将其作为方法的返回值。
     * 参数：defaultValue—如果用户不输入字符而直接回车，方法将以defaultValue作为返回值。
     * （提示：此方法可在修改农产品时调用）
     */
    public static char readChar(){
        while(true){
            try {
                String str = read.readLine();
                if(str.isEmpty()) continue;
                return str.charAt(0);
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }
    }

    public static char readChar(char defaultValue){
        try {
            String str = read.readLine();
            if(str.isEmpty()) return defaultValue;
            else return str.charAt(0);
        } catch (IOException e) {
            throw new RuntimeException("输入方式不合法请重新选择");
        }
    }

    /*
     * 用途：这两个方法功能相同，均从键盘读取一个长度不超过2位的整数，并将其作为方法的返回值。
     * 参数：defaultValue—如果用户不输入字符而直接回车，方法将以defaultValue作为返回值。
     */
    public static int readInt(){
        while(true) {
            try {
                String str = read.readLine();
                try {
                    return Integer.parseInt(str);
                }catch (Exception e){
                    System.out.println("输入类型不合法");
                }
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }
    }

    public static int readInt(int defaultValue){
        while(true) {
            try {
                String str = read.readLine();
                if(str.isEmpty()) return defaultValue;
                else {
                    try {
                        return Integer.parseInt(str);
                    }catch (Exception e){
                        System.out.println("输入类型不合法");
                    }

                }
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }
    }

    /*
     * 用途：这两个方法功能相同，均从键盘读取一个长度不超过limit的字符串，并将其作为方法的返回值。
     * 参数：limit—指定字符串的最大长度
     * defaultValue—如果用户不输入字符而直接回车，方法将以defaultValue作为返回值。
     */
    public static String readString(int limit){
        while(true){
            try {
                String str = read.readLine();
                if(str.isEmpty() || str.length() > limit){
                    System.out.println("字符串长度不合法");
                    continue;
                }
                return str;
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }
    }

    public static String readString(int limit, String defaultValue){
        while(true){
            try {
                String str = read.readLine();
                if(str.isEmpty()) return defaultValue;
                else if(str.length() > limit){
                    System.out.println("字符串长度不合法");
                    continue;
                }
                return str;
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }
    }

    /*
     * 用途：从键盘读取‘Y’或’N’，并将其作为方法的返回值。
     */
    public static char readConfirmSelection(){
        while(true){
            try {
                String str = read.readLine();
                char key = str.charAt(0);
                if(key == 'Y' || key == 'N') return key;
                else System.out.println("输入类型不合法");
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }
    }


    /*
     * 用途：这两个方法功能相同，均从键盘读取一个浮点数，并将其作为方法的返回值。
     * 参数：defaultValue—如果用户不输入字符而直接回车，方法将以defaultValue作为返回值。
     */
    public static double readDouble() {
        while(true) {
            try {
                String str = read.readLine();
                try {
                    return Double.parseDouble(str);
                }catch (Exception e){
                    System.out.println("输入类型不合法");
                }
            } catch (IOException e) {
                throw new RuntimeException("输入格式错误请重新输入");
            }
        }
    }

    public static double readDouble(double defaultValue){
        while(true) {
            try {
                String str = read.readLine();
                try {
                    if(str.isEmpty()) return defaultValue;
                    return Double.parseDouble(str);
                }catch (Exception e){
                    System.out.println("输入类型不合法");
                }
            } catch (IOException e) {
                throw new RuntimeException("输入方式不合法请重新选择");
            }
        }

    }

}
